home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 / Ham Radio 2000.iso / ham2000 / tcp_ip / tnos / tnos100s / pop3cli.c < prev    next >
C/C++ Source or Header  |  1993-11-29  |  3KB  |  148 lines

  1. /* Post Office Protocol (POP3) Client -- RFC1225
  2.  * Copyright 1992 William Allen Simpson
  3.  *    partly based on a NNTP client design by Anders Klemets, SM0RGV
  4.  *      and POP2 Client by Mike Stockett, WA7DYX, et alia.
  5.  */
  6. #include <stdio.h>
  7. #include <time.h>
  8. #include "global.h"
  9. #include "timer.h"
  10. #include "proc.h"
  11. #include "netuser.h"
  12. #include "socket.h"
  13. #include "cmdparse.h"
  14. #include "files.h"
  15. #include "mailcli.h"
  16. #include "mailutil.h"
  17. #include "smtp.h"
  18.  
  19.  
  20. void
  21. pop3_job(unused,v1,p2)
  22. int unused;
  23. void *v1;
  24. void *p2;
  25. {
  26.     struct mailservers *np = v1;
  27.     struct sockaddr_in fsocket;
  28.     char buf[TLINELEN];
  29.     char *cp;
  30.     FILE *wfp = NULLFILE;
  31.     time_t t;
  32.     int s = -1;
  33.     int bytes;
  34.     int messages;
  35.     int i;
  36.  
  37.     if ( mailbusy( np ) )
  38.         return;
  39.  
  40.     if ( (fsocket.sin_addr.s_addr = resolve(np->hostname)) == 0L ) {
  41.         /* No IP address found */
  42.         if (Mailtrace >= 1)
  43.             log(-1,"POP3 can't resolve host '%s'", np->hostname);
  44.         start_timer(&np->timer);
  45.         return;
  46.     }
  47.  
  48.     fsocket.sin_family = AF_INET;
  49.     fsocket.sin_port = IPPORT_POP3;
  50.  
  51.     s = socket(AF_INET,SOCK_STREAM,0);
  52.     sockmode(s,SOCK_ASCII);
  53.  
  54.     if (connect(s,(char *)&fsocket,SOCKSIZE) == -1) {
  55.         cp = sockerr(s);
  56.         if (Mailtrace >= 2)
  57.             log(s,"POP3 Connect failed: %s",
  58.                 cp != NULLCHAR ? cp : "" );
  59.         goto quit;
  60.     }
  61.  
  62.     log(s,"POP3 Connected to mailhost %s", np->hostname);
  63.  
  64.     /* Eat the banner */
  65.     if ( mailresponse( s, buf, "banner" ) == -1
  66.       || buf[0] == '-' ) {
  67.         goto quit;
  68.     }
  69.  
  70.     usprintf(s,"USER %s\n", np->username);
  71.     if ( mailresponse( s, buf, "USER" ) == -1
  72.       || buf[0] == '-' ) {
  73.         goto quit;
  74.     }
  75.  
  76.     usprintf(s,"PASS %s\n", np->password);
  77.     if ( mailresponse( s, buf, "PASS" ) == -1
  78.       || buf[0] == '-' ) {
  79.         goto quit;
  80.     }
  81.  
  82.     usprintf(s,"STAT\n" );
  83.     if ( mailresponse( s, buf, "STAT" ) == -1
  84.       || buf[0] == '-' ) {
  85.         goto quit;
  86.     }
  87.  
  88.     rip(buf);
  89.     if ( Mailtrace >= 1 )
  90.         log(s,"POP3 status %s",buf);
  91.     sscanf(buf,"+OK %d %d",&messages,&bytes);
  92.  
  93.     for ( i = 0; i++ < messages; ) {
  94.         if ((wfp = tmpfile()) == NULLFILE) {
  95.             if ( Mailtrace >= 1 )
  96.                 log(s,"POP3 Cannot create tmp file" );
  97.             goto quit;
  98.         }
  99.  
  100.         usprintf(s,"RETR %d\n", i);
  101.         if ( mailresponse( s, buf, "RETR" ) == -1 )
  102.             goto quit;
  103.         if ( buf[0] == '-' ) {
  104.             continue;
  105.         }
  106.  
  107.         time(&t);
  108.         fprintf( wfp, "From POP3@%s %s",
  109.             np->hostname,
  110.             ctime(&t));
  111.  
  112.         if ( recvmail(s, buf, TLINELEN, wfp, Mailtrace) == -1 ) {
  113.             goto quit;
  114.         }
  115.  
  116.         if ( copymail(buf, TLINELEN, wfp ) == -1 )
  117.             goto quit;
  118.         fclose (wfp);
  119.  
  120.         usprintf(s,"DELE %d\n", i);
  121.         if ( mailresponse( s, buf, "DELE" ) == -1
  122.           || buf[0] == '-' ) {
  123.             goto quit;
  124.         }
  125.     }
  126.  
  127.     usprintf(s,"QUIT\n" );
  128.     mailresponse( s, buf, "QUIT" );
  129.  
  130.     if ( messages ) {
  131.         tprintf("New mail arrived for %s from mailhost %s%c\n",
  132.                 np->mailbox,
  133.                 np->hostname,
  134.                 Mailquiet ? ' ' : '\007');
  135.         smtptick(NULL);     /* wake SMTP to send that mail */
  136.     }
  137.  
  138. quit:
  139.     log(s,"POP3 daemon exiting" );
  140.     close_s(s);
  141.  
  142.     if (wfp != NULLFILE)
  143.         fclose(wfp);
  144.     start_timer(&np->timer);
  145. }
  146.  
  147.  
  148.